package pers.zb.cloud.gateway.handler.routeconfig;

import org.springframework.beans.BeansException;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import pers.zb.cloud.gateway.handler.ZuulFallbackHandler;

import java.util.Map;

/**
 * 加载yml中配置的zuul.routes列表，在系统启动的时候，为每一个API服务设置异常容错处理
 * 主要的作用是当API服务不可用的时候，可以容错、返回通用的JSON格式的错误结果，而不是错误异常的页面
 */
public class RouteFallbackHandlerConfig implements ApplicationContextAware{
    private static ApplicationContext applicationContext = null;

    /**
     * 存储所有的routes
     */
    private static Map<String,ZuulProperties.ZuulRoute> propertiesMap =null;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(RouteFallbackHandlerConfig.applicationContext == null){
            RouteFallbackHandlerConfig.applicationContext  = applicationContext;
        }

        //加载yml中配置的所有API服务routes
        initRoute();
    }

    /**
     * 加载yml中配置的所有API服务routes，设置通用的 ZuulFallbackHandler 容错处理器
     */
    private void initRoute() {
        if (propertiesMap ==null){
            RouteProperties ymlConfig = RouteFallbackHandlerConfig.applicationContext.getBean(RouteProperties.class);
            propertiesMap = ymlConfig.getRoutes();
        }
        for (String key : propertiesMap.keySet()) {
            ZuulFallbackHandler routeZuulFallback = new ZuulFallbackHandler();
            routeZuulFallback.setRoute(propertiesMap.get(key).getServiceId());//为每一个API服务设置异常处理器
        }
    }
}